package main

import (
	"fmt"
	"runtime"
	"time"
)

/*
使用GOMAXPROCS参数来确定需要使用多少个OS线程来同时执行Go代码

Go语言中的操作系统线程和goroutine的关系：

1.一个操作系统线程对应用户态多个goroutine。
2.go程序可以同时使用多个操作系统线程。
3.goroutine和OS线程是多对多的关系，即m:n。
*/

func a() {
	for i := 1; i < 10; i++ {
		fmt.Println("A:", i)
	}
}

func b() {
	for i := 1; i < 10; i++ {
		fmt.Println("B:", i)
	}
}

func main() {
	//runtime.GOMAXPROCS(1)
	runtime.GOMAXPROCS(2)
	go a()
	go b()
	time.Sleep(time.Second)
	/*
		当参数是1，说明两个协程是在一个OS线程上运行，所以输出本质就是一个线程
		B: 1
		B: 2
		B: 3
		B: 4
		B: 5
		B: 6
		B: 7
		B: 8
		B: 9
		A: 1
		A: 2
		A: 3
		A: 4
		A: 5
		A: 6
		A: 7
		A: 8
		A: 9

		当参数是2，两个协程就在2个OS线程上运行，结果就是并行的
		B: 1
		B: 2
		B: 3
		B: 4
		B: 5
		A: 1
		A: 2
		A: 3
		A: 4
		A: 5
		A: 6
		A: 7
		A: 8
		A: 9
		B: 6
		B: 7
		B: 8
		B: 9
	*/
}
